#coding=UTF-8

"""做一个文件去重系统，需要用到os模块，还有正则
1,强去重，扫描一个目录下，文件名+扩展名相同才记录；
2，只是文件名相同，用正则过滤扩展名；
3，名称n%相同，n可以设置，例如80；
4，基于md5的去重：生成每个文件的md5，然后写入list或者用collections，同一个md5出现2次及以上就写入文件

效果类似于everything
"""
import hashlib
def findSameFile(lst=[]):
    #将lst中相同的元素统计并写入文件中
    d={}
    for c in lst:
        d[c]=(d[c]+1)if (c in d) else(1)
    with open("D:/python_works/去重实战pic111.txt",'a+') as f:
        for k,i in d.items():
            if i>1:
                f.write(k+' : '+str(i)+'\n')
    print('end')

def md5(fname,size=4096):#用md5函数生成每个文件的md5值，对4096不理解多少
    hash_md5 = hashlib.md5()
    with open(fname, 'rb') as f:
        for chunk in iter(lambda: f.read(size), b''):
            hash_md5.update(chunk)
    return hash_md5.hexdigest()
	
def countFileList(pathlcf):
    import os#input:需要walk（扫描一遍）的目录
    lst=[]#装有所有文件名的列表
    lcflit=[[],[]]#第一个元素是有重复的文件的文件名，[1]是重复文件位置
    
    d = {}#用来统计重复次数
    wri_resul_f="D:/python_works/去重实战pic2.txt"
    #结果保存文件
    for root, dirs, files in os.walk(pathlcf):
        lst.extend(files)#walk函数的使用

    for c in lst:#统计过程,也可以用Counter实现
        d[c] = (d[c] + 1) if (c in d) else(1)

    with open(wri_resul_f, 'a+') as f:
        #统计重复的文件名以及重复个数
        #f.write(str(len(lst)))#一共有多少个文件
        for k, i in d.items():
            if i > 1:
                lcflit[0].append(k)#[0]装重复的文件名，用以下一步的找文件位置
                f.write(k + ' : ' + str(i) + '\n')

    for root, dirs, files in os.walk(pathlcf):
        for a in lcflit[0]:
            if a in files:
                lcflit[1].append(str(root)+'\\'+a)
    with open("D:/python_works/去重实战pic13.txt", 'a+') as fi:
        #统计找出的文件位置
        #fi.write(str(len(lcflit[1])))#重复的文件数
        fi.write(str(lcflit[1]))
    print('finish')


if __name__ == '__main__':
    import time
    na=time.time()
    walk_path="F:/LcfLev/Pic-618-" #要找的位置
    countFileList(walk_path)
    print('Using time:',time.time()-na)

